package com.smh.demo1.a11;

import org.springframework.cglib.core.Signature;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author shiminghui
 * @date 2025/4/16 17:35
 * @description: TODO
 */
//这个类是在MethodProxy创建后第一次invoke时生成的,是动态生成的,在第一次invoke时会获取到index,保存,后序使用
// 内部会存储 FastClass的引用
// 每个代理对象只有一个FastClass,是通过目标类和代理类来确定这个代理类的FastClass是否存在,如果存在,则直接使用,不存在则创建
// 而,每个MethodProxy对象,都有相同的代理类,所以,每个代理对象,都会有一个FastClass,而且,FastClass是共享的,
public class ProxyFastClass {

    static Signature readSignature = new Signature("readSuper", "()V");

    public static void main(String[] args) {
        ProxyFastClass targetFastClass = new ProxyFastClass();
        int index = targetFastClass.getIndex(new Signature("readSuper", "()V"));
        try {
            targetFastClass.invoke(index, new Proxy(new MethodInterceptor() {
                @Override
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    Object o1 = methodProxy.invokeSuper(o, objects);
                    return o1;
                }
            }), new Object[]{3});
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    }

    public int getIndex(Signature signature) {
        if (readSignature.equals(signature)) {
            return 0;
        } else {
            return -1;
        }
    }

    public Object invoke(int index, Object proxy, Object[] args) throws Throwable {
        if (index == 0) {
            ((Proxy) proxy).readSuper((int) args[0]);
        }
        return null;
    }

}
